package ar.com.tallerdos.smartdinner.sync;

import java.util.ArrayList;
import java.util.List;

import android.util.Log;
import ar.com.tallerdos.smartdinner.business.ComidaBusiness;
import ar.com.tallerdos.smartdinner.business.AgregadoBusiness;
import ar.com.tallerdos.smartdinner.business.MesaBusiness;
import ar.com.tallerdos.smartdinner.business.ProductoBusiness;
import ar.com.tallerdos.smartdinner.gson.serializer.ComidaCustomSerializer;
import ar.com.tallerdos.smartdinner.gson.serializer.PedidoCustomSerializer;
import ar.com.tallerdos.smartdinner.model.Comida;
import ar.com.tallerdos.smartdinner.model.Agregado;
import ar.com.tallerdos.smartdinner.model.Mesa;
import ar.com.tallerdos.smartdinner.model.Pedido;
import ar.com.tallerdos.smartdinner.model.Producto;
import ar.com.tallerdos.smartdinner.util.UsrManager;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

public class ComidaSincronizador extends Tarea {

    private static final String MESAS_ABIERTAS_PROPIAS_SERVICE = "consultarMesasAbiertas.php";

    private List<Comida> comidas;

    @Override
    public Integer realizarTarea() {
	String response = llamarWebService(SERVER_URL + "/"
		+ MESAS_ABIERTAS_PROPIAS_SERVICE + "?mozo_id="
		+ UsrManager.getInstance().getUsuario().getId());

	parsearJson(response);

	if (this.comidas != null && this.comidas.size() > 0) {
	    for (Comida comida : this.comidas) {
		ComidaBusiness.createOrUpdate(comida);
	    }
	} else {
	    Log.e("log_tag", "Novedades de Pedido - Sin novedades");
	}

	Log.e("log_tag", "Fin Proceso de Novedades de Pedido");
	return null;
    }

    private void parsearJson(String response) {
	Gson gson = new GsonBuilder()
		.registerTypeAdapter(Comida.class, new ComidaCustomSerializer())
		.registerTypeAdapter(Pedido.class, new PedidoCustomSerializer())
		.create();

	this.comidas = gson.fromJson(response, new TypeToken<List<Comida>>() {}.getType());

	if (this.comidas != null) {

	    for (Comida comida : this.comidas) {
		List<Mesa> mesas = comida.getMesas();
		comida.setMesas(new ArrayList<Mesa>());
		for (Mesa mesa : mesas) {
		    Mesa mesaCompleta = MesaBusiness.findById(mesa.getId());
		    if (mesaCompleta != null) {
			comida.getMesas().add(mesaCompleta);
		    }
		}

		for (Pedido p : comida.getPedidos()) {
		    Producto prod = ProductoBusiness.findById(p.getProducto().getId());
		    if (prod != null) {
			p.setProducto(prod);
		    } else {
			Log.e("Error", "No se encontro el producto con id :" + p.getProducto().getId());
		    }
		    List<Agregado> agregados = p.getAgregados();
		    p.setAgregados(new ArrayList<Agregado>());
		    for (Agregado a : agregados) {
			Agregado agregado = AgregadoBusiness.findById(a.getId());
			if (agregado != null) {
			    p.getAgregados().add(agregado);	
			} else {
			    Log.e("Error", "No se encontro el agregado con id :" + a.getId());
			}
		    }
		}
	    }
	}
    }

}
